package com.ufcg.lvc.client.prototipacao;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.smartgwt.client.widgets.Slider;
import com.smartgwt.client.widgets.Window;
import com.ufcg.lvc.client.GreetingServiceCRUD;
import com.ufcg.lvc.client.GreetingServiceCRUDAsync;
import com.ufcg.lvc.client.UserData;

public class NovaQuestao {

	private AbsolutePanel painelNovaQuestao;
	private Label lblTitulo;
	private Slider dificuldadeSlider;
	private TextBox tituloTB, assuntoTB;
	private TextArea enunciadoTA;
	private RadioButton objetivaRB, subjetivaRB;
	private ListBox alternativasLB;
	
	private Boolean editar = false;
	private Boolean exibir = false;
	
	private String tipo = "Subjetiva";
	private String tituloAntigo = "";
	private String questao_id = "";
	private String titulo="";
	
	private ArrayList<String> alterEnunciado = new ArrayList<String>();
	private ArrayList<String> alterCorretude = new ArrayList<String>();
	private ArrayList<String> alterImagem = new ArrayList<String>();
	private List<String> tituloQuestoes;
	
	private Button btnRemover, btnEditar, btnCriar, btnCancelar;
	UserData UD;
	
	public static GreetingServiceCRUDAsync getServicoCRUD() {
		return GWT.create(GreetingServiceCRUD.class);
	}

	public NovaQuestao(UserData uD) {
		UD = uD;
		getServicoCRUD().getNextIDQuestao( new AsyncCallback<String>() {
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}

			@Override
			public void onSuccess(String result) {
				System.out.println("result "+ result);
				questao_id = result;
			}
		});
		draw();
	}

	/** Editar questao/exibir*/
	public NovaQuestao(String titulo, String assunto, String enunciado,	String tipo, String dificuldade, boolean exibir, UserData uD) {
		UD = uD;
		final AsyncCallback<String> callbackStr = new AsyncCallback<String>() {
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}

			@Override
			public void onSuccess(String result) {
				System.out.println("result "+ result);
				questao_id = result;
			}
		};
		getServicoCRUD().getIDQuestao(titulo, UD.getId_usuario(), callbackStr);
		this.titulo = titulo;
		this.exibir = exibir;
		this.editar = true;
		try {
			draw();	
		} catch (Exception e) {
		}
		atualizarCampos(titulo, assunto, enunciado, tipo, dificuldade, exibir);
	}

	// Atualizar campos (editar questao) - inicio
	private void atualizarCampos(String titulo, String assunto,	String enunciado, String tipo, String dificuldade, boolean exibir) {
		
		lblTitulo.setText("Editar questão");
		tituloAntigo = titulo;
		tituloTB.setText(titulo);
		assuntoTB.setText(assunto);
		enunciadoTA.setText(enunciado);
		
		double dif = Double.parseDouble(dificuldade);
		dificuldadeSlider.setValue((float) dif);
		
		if (tipo.equalsIgnoreCase("Objetiva")) {
			objetivaRB.setValue(true);
			subjetivaRB.setValue(false);
		} else {
			objetivaRB.setValue(false);
			subjetivaRB.setValue(true);
			
			alternativasLB.setEnabled(false);
			btnCriar.setEnabled(false);
			btnEditar.setEnabled(false);
			btnRemover.setEnabled(false);
			alternativasLB.setFocus(false);
		}
		
		if (exibir  == true){
			alternativasLB.setEnabled(false);
			btnCriar.setEnabled(false);
			btnEditar.setEnabled(false);
			btnRemover.setEnabled(false);
			alternativasLB.setFocus(false);
			objetivaRB.setEnabled(false);
			subjetivaRB.setEnabled(false);
			dificuldadeSlider.setCanDrag(false);
		}		
	}// Atualizar campos (editar questao) - fim

	/** Densenhar tela nova questao*/
	public void draw() {

		final AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}

			@Override
			public void onSuccess(Boolean result) {
			}
		};
		
		getServicoCRUD().getQuestoes(UD.getId_usuario(), new AsyncCallback<List<List<String>>>() {
			@Override
			public void onSuccess(List<List<String>> result) {
				tituloQuestoes = result.get(0);
				tituloQuestoes.remove(tituloAntigo);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				tituloQuestoes = new ArrayList<String>();
			}
		});
			
		alternativasLB = new ListBox();
		alternativasLB.setSize("608px", "82px");
		alternativasLB.setVisibleItemCount(5);
		
		getServicoCRUD().getAlternativas(titulo, UD.getId_usuario(), new AsyncCallback<List<List<String>>>() {

			@Override
			public void onFailure(Throwable caught) {
				System.out.println("Erro na comunicação com o servidor");
			}
			
			@Override
			public void onSuccess(List<List<String>> result) {
				alterEnunciado = (ArrayList<String>) result.get(0);
				alterCorretude = (ArrayList<String>) result.get(1);
				alterImagem = (ArrayList<String>) result.get(2);
				for (int i = 0; i < alterEnunciado.size(); i++) {
					alternativasLB.addItem(alterEnunciado.get(i).toString());
				}
			}
		});
		
		// Desenhar tela nova questao - inicio
		painelNovaQuestao = new AbsolutePanel();
		painelNovaQuestao.setSize("900px", "707px");
		lblTitulo = new Label("Nova questão");
		lblTitulo.setStyleName("gwt-TituloMedio");
		painelNovaQuestao.add(lblTitulo, 0, 10);
		
		if (exibir == true) {
			lblTitulo.setText("Questão");
		}

		Label lblTituloQuestao = new Label("Título:");
		painelNovaQuestao.add(lblTituloQuestao, 60, 69);
		lblTituloQuestao.setSize("43px", "17px");

		Label lblAssuntoAbordado = new Label("Assunto abordado:");
		painelNovaQuestao.add(lblAssuntoAbordado, 60, 109);
		lblAssuntoAbordado.setSize("165px", "17px");

		Label lblEnunciado = new Label("Enunciado:");
		lblEnunciado.setDirectionEstimator(true);
		painelNovaQuestao.add(lblEnunciado, 60, 162);
		lblEnunciado.setSize("75px", "17px");

		Label lblDificuldade = new Label("Dificuldade:");
		painelNovaQuestao.add(lblDificuldade, 60, 344);
		lblDificuldade.setSize("80px", "17px");

		Label lblImagem = new Label("Imagem:");
		painelNovaQuestao.add(lblImagem, 60, 410);
		lblImagem.setSize("61px", "17px");

		tituloTB = new TextBox();
		painelNovaQuestao.add(tituloTB, 235, 69);
		tituloTB.setSize("422px", "14px");

		assuntoTB = new TextBox();
		painelNovaQuestao.add(assuntoTB, 235, 109);
		assuntoTB.setSize("422px", "14px");

		enunciadoTA = new TextArea();
		enunciadoTA.setSize("593px", "153px");
		painelNovaQuestao.add(enunciadoTA, 235, 162);

		dificuldadeSlider = new Slider();
		dificuldadeSlider.setSize("188px", "17px");
		dificuldadeSlider.setShowValue(false);
		dificuldadeSlider.setShowTitle(false);
		dificuldadeSlider.setTitle("");
		dificuldadeSlider.setMinValueLabel("Fácil");
		dificuldadeSlider.setMaxValueLabel("Difícil");
		dificuldadeSlider.setVertical(false);
		painelNovaQuestao.add(dificuldadeSlider, 235, 344);

		final FileUpload imagemFU = new FileUpload();
		painelNovaQuestao.add(imagemFU, 229, 405);
		imagemFU.setSize("295px", "26px");

		Label lblTipoDeQuestao = new Label("Tipo de questão:");
		painelNovaQuestao.add(lblTipoDeQuestao, 60, 461);
		lblTipoDeQuestao.setSize("129px", "17px");

		objetivaRB = new RadioButton("new name", "Objetiva");
		painelNovaQuestao.add(objetivaRB, 235, 461);
		objetivaRB.setValue(false);
		objetivaRB.setSize("77px", "17px");

		subjetivaRB = new RadioButton("new name", "Subjetiva");
		painelNovaQuestao.add(subjetivaRB, 235, 482);
		subjetivaRB.setValue(true);
		subjetivaRB.setSize("83px", "17px");

		Label lblAlternativas = new Label("Alternativas:");
		painelNovaQuestao.add(lblAlternativas, 60, 519);
		lblAlternativas.setSize("90px", "17px");

		btnRemover = new Button("Remover");
		painelNovaQuestao.add(btnRemover, 757, 607);
		btnRemover.setSize("81px", "30px");
		btnRemover.setEnabled(false);

		btnEditar = new Button("Editar");
		painelNovaQuestao.add(btnEditar, 670, 607);
		btnEditar.setSize("81px", "30px");
		btnEditar.setEnabled(false);
		
		btnCriar = new Button("Criar");
		painelNovaQuestao.add(btnCriar, 583, 607);
		btnCriar.setSize("81px", "30px");
		btnCriar.setEnabled(false);
		
		painelNovaQuestao.add(alternativasLB, 230, 519);
		alternativasLB.setEnabled(false);
		
		btnCancelar = new Button("Cancelar");
		painelNovaQuestao.add(btnCancelar, 457, 667);
		btnCancelar.setSize("81px", "30px");
		if (exibir == true){
			tituloTB.setEnabled(false);
			enunciadoTA.setEnabled(false);
			dificuldadeSlider.setCanDrag(false);
			assuntoTB.setEnabled(false);
			imagemFU.setEnabled(false);
		}	
		// Desenhar tela nova questao - fim
		
		
		if (exibir == false){
			
			final Button btnSalvar = new Button("Salvar");
			painelNovaQuestao.add(btnSalvar, 370, 667);
			btnSalvar.setSize("81px", "30px");
			btnSalvar.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					System.out.println("questa id = " + questao_id);
					
					if (!tituloTB.getText().trim().equals("") && !assuntoTB.getText().trim().equals("") && !enunciadoTA.getText().trim().equals("")) {
							if (!tituloQuestoes.contains(tituloTB.getText())){
								
								if (editar == false) {
									getServicoCRUD().salvarQuestao(tituloTB.getText(), assuntoTB.getText(), enunciadoTA.getText(), String.valueOf(dificuldadeSlider.getValue()), tipo, imagemFU.getFilename(),questao_id, UD.getId_usuario(), callback);
								} else {
									getServicoCRUD().updateQuestao(tituloAntigo,tituloTB.getText(),	assuntoTB.getText(), enunciadoTA.getText(),	String.valueOf(dificuldadeSlider.getValue()), tipo,	imagemFU.getFilename(), UD.getId_usuario(), callback);
								}
								getServicoCRUD().salvarAlternativa(questao_id, alterImagem, alterEnunciado, alterCorretude, callback);		
								painelNovaQuestao.clear();
								final MinhasQuestoes n = new MinhasQuestoes(UD);
								painelNovaQuestao.add(n.getPanel());
								
							} else{
								com.google.gwt.user.client.Window.alert("Título não disponível. Você já possui uma questão com esse título.");
							}
					} else {
						com.google.gwt.user.client.Window.alert("Os campos título, assunto abordado e enunciado devem ser preenchidos.");	
					}
							
				}
			});
		}
		
		
		// ClickHandler's - inicio
		subjetivaRB.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				alternativasLB.setEnabled(false);
				btnCriar.setEnabled(false);
				btnEditar.setEnabled(false);
				btnRemover.setEnabled(false);
				alternativasLB.setFocus(false);
				tipo = "Subjetiva";
			}
		});

		objetivaRB.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				alternativasLB.setEnabled(true);
				btnCriar.setEnabled(true);
				btnEditar.setEnabled(true);
				btnRemover.setEnabled(true);
				alternativasLB.setFocus(true);
				tipo = "Objetiva";
			}
		});
		
		btnCancelar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				painelNovaQuestao.clear();
				final MinhasQuestoes n = new MinhasQuestoes(UD);
				painelNovaQuestao.add(n.getPanel());
			}
		});
		
		btnRemover.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				System.out.println(	"alternativas: "+ alternativasLB.toString() +"\nenunciados: "+ alterEnunciado.toString()+ "\ncorretas: "+ alterCorretude.toString()+"\nimagens: "+  alterImagem.toString());
				int i = alternativasLB.getSelectedIndex();
				alternativasLB.removeItem(i);				
				alterEnunciado.remove(i);
				alterCorretude.remove(i);
				alterImagem.remove(i);
			}
		});
		
		btnEditar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int i = alternativasLB.getSelectedIndex();
				
				// Desenhar tela alternativa - inicio
				final Window winModal = new Window();
				winModal.setWidth(766);
				winModal.setHeight(268);
				winModal.setTitle("Modal Window");
				winModal.setShowMinimizeButton(false);
				winModal.setIsModal(true);
				winModal.setShowModalMask(true);
				winModal.centerInPage();

				AbsolutePanel absolutePanel_10 = new AbsolutePanel();
				absolutePanel_10.setSize("736px", "238px");

				Label lblEnunciadoDaAlternativa = new Label("Enunciado:");
				absolutePanel_10.add(lblEnunciadoDaAlternativa, 21, 21);

				final TextArea enunciadoAlternativa = new TextArea();
				enunciadoAlternativa.setSize("592px", "110px");
				enunciadoAlternativa.setText(alterEnunciado.get(i));
				absolutePanel_10.add(enunciadoAlternativa, 107, 21);

				Label label = new Label("Imagem:");
				absolutePanel_10.add(label, 21, 151);
				label.setSize("64px", "17px");

				final FileUpload imagemAlternativa = new FileUpload();
				absolutePanel_10.add(imagemAlternativa, 91, 147);
				imagemAlternativa.setSize("295px", "26px");

				final CheckBox chckbxAlternativaCorreta = new CheckBox("Alternativa correta");
				chckbxAlternativaCorreta.setValue(false);
				if (alterCorretude.get(i).equals("true")) {
					chckbxAlternativaCorreta.setValue(true);	
				}
				absolutePanel_10.add(chckbxAlternativaCorreta, 565, 147);

				Button cancelarAlternativaBT = new Button("Excluir");
				cancelarAlternativaBT.setText("Cancelar");
				absolutePanel_10.add(cancelarAlternativaBT, 370, 199);
				cancelarAlternativaBT.setSize("97px", "29px");

				Button salvarAlternativaBT = new Button("Salvar");
				absolutePanel_10.add(salvarAlternativaBT, 267, 199);
				salvarAlternativaBT.setSize("97px", "29px");

				winModal.addItem(absolutePanel_10);
				winModal.show();
				// Desenhar tela alternativa - fim
			}
		});
		
		/** Botao que vai criar uma nova alternativa */
		btnCriar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				if (alternativasLB.getItemCount() == 5) {
					com.google.gwt.user.client.Window.alert("Número máximo de alternativas atingido");
				} else {
					
				
					// Desenhar tela alternativa - inicio
					final Window winModal = new Window();
					winModal.setWidth(766);
					winModal.setHeight(268);
					winModal.setTitle("Modal Window");
					winModal.setShowMinimizeButton(false);
					winModal.setIsModal(true);
					winModal.setShowModalMask(true);
					winModal.centerInPage();
	
					AbsolutePanel absolutePanel_10 = new AbsolutePanel();
					absolutePanel_10.setSize("736px", "238px");
	
					Label lblEnunciadoDaAlternativa = new Label("Enunciado:");
					absolutePanel_10.add(lblEnunciadoDaAlternativa, 21, 21);
	
					final TextArea enunciadoAlternativa = new TextArea();
					enunciadoAlternativa.setSize("592px", "110px");
					absolutePanel_10.add(enunciadoAlternativa, 107, 21);
	
					Label label = new Label("Imagem:");
					absolutePanel_10.add(label, 21, 151);
					label.setSize("64px", "17px");
	
					final FileUpload imagemAlternativa = new FileUpload();
					absolutePanel_10.add(imagemAlternativa, 91, 147);
					imagemAlternativa.setSize("295px", "26px");
	
					final CheckBox chckbxAlternativaCorreta = new CheckBox("Alternativa correta");
					chckbxAlternativaCorreta.setValue(true);
					absolutePanel_10.add(chckbxAlternativaCorreta, 565, 147);
	
					Button cancelarAlternativaBT = new Button("Excluir");
					cancelarAlternativaBT.setText("Cancelar");
					absolutePanel_10.add(cancelarAlternativaBT, 370, 199);
					cancelarAlternativaBT.setSize("97px", "29px");
	
					Button salvarAlternativaBT = new Button("Excluir");
					salvarAlternativaBT.setText("Salvar");
					absolutePanel_10.add(salvarAlternativaBT, 267, 199);
					salvarAlternativaBT.setSize("97px", "29px");
	
					winModal.addItem(absolutePanel_10);
					winModal.show();
					// Desenhar tela alternativa - fim
	
					// Botoes tela alternativa - inicio
					cancelarAlternativaBT.addClickHandler(new ClickHandler() {
						@Override
						public void onClick(ClickEvent event) {
							winModal.destroy();
						}
					});
					salvarAlternativaBT.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							if(!enunciadoAlternativa.getText().trim().equals("")) {
								String imagem_id ="-1";
								alternativasLB.addItem(enunciadoAlternativa.getText());
								alterEnunciado.add(enunciadoAlternativa.getText());
								alterCorretude.add(chckbxAlternativaCorreta.getValue().toString());
								alterImagem.add(imagem_id);
								winModal.destroy();
							} else {
								com.google.gwt.user.client.Window.alert("O campo enunciado da alternativa deve ser preenchido.");
							}
						}
					});
					// Botoes tela alternativa - fim
				}
			}
		});
		// ClickHandler's - fim
	}// Draw - fim

	public Button getBtnVoltarSetClickHandler(ClickHandler c){
		btnCancelar.setText("Voltar");
		btnCancelar.addClickHandler(c);
		return btnCancelar;
	}
	
	public AbsolutePanel getPanel() {
		return painelNovaQuestao;
	}
}

